package 所有的题类.ZA.链表;

import com.kiwi.nixu.common.LNode;
import org.omg.PortableServer.LIFESPAN_POLICY_ID;

import java.util.Arrays;
import java.util.List;

public class K个一组翻转链表 {


    public static LNode arrayToLNode(List<Integer> list){
        LNode lNode = new LNode(list.get(0));
        LNode cur=lNode;
        for (int i = 1; i < list.size(); i++) {
            LNode tmp=new LNode(list.get(i));
            cur.next=tmp;
            cur=tmp;
        }
        return lNode;
    }

    public static void main(String[] args) {
        //LNode lNode = arrayToLNode(Arrays.asList(1, 2,3,4,5));
        //
        //LNode lNode1 = reverseKGroup(lNode, 2);
        //System.out.println(lNode1.data);
        System.out.println((int)'C');
    }

    public static LNode reverseKGroup(LNode  head, int k) {
        return rollingOver(head,k);
    }

    public static LNode  rollingOver(LNode  head,int c){
        LNode tail=null;
        LNode segHead=null;
        int num=0;
        //循环遍历每个节点
        while(head!=null){
            LNode  check=head;
            int step=c-1;
            //验证是否还有k个节点去反转
            while(step>0 && check.next!=null){
                check=check.next;
                step--;
            }
            //如果满足的将k个
            //遍历的时候还要保证如果到尾部不足k则保持原来的样子
            if(step==0){
                int k=c;
                LNode cur=head;
                LNode pre=null;
                //链表反转
                while (cur!=null && k>0){
                    LNode tmp=cur.next;
                    cur.next=pre;
                    //保存每段链表反转之后最后一个节点
                    pre=cur;
                    cur=tmp;
                    k--;
                }
                if(segHead==null){
                    segHead=pre;
                    tail=segHead;
                    while (tail.next!=null){
                        tail=tail.next;
                    }
                }
                //得到上次段链表的尾部节点，连接本次的段链表头结点
                if(tail!=null && num!=0){
                    tail.next=pre;
                    while (tail.next!=null){
                        tail=tail.next;
                    }
                }
                head=cur;
            }else{
                tail.next=head;
                head=head.next;
            }
            num++;
        }
        return segHead;
    }
}
